package com.yxx.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

/**
 * 拷贝工具类
 * @author yuxiangxun
 * @date 2025/1/17
 * @apiNote
 */
@Slf4j
public class BeanCopyUtils {
    public static<T> T copyBean(Object source, Class<T> target){
        // 创建目标对象
        T resultObject = null;
        try {
            // 通过反射类加载对象获取目标类的无参构造函数
            Constructor<T> declaredConstructor = target.getDeclaredConstructor();
            // 使用无参构造函数创建目标类的新实例
            resultObject = declaredConstructor.newInstance();
            // 如果源对象不为空
            if(source != null){
                // 使用BeanUtils工具类进行属性拷贝
                BeanUtils.copyProperties(source,resultObject);
            }

        }catch (Exception e){
            log.error("copyBean error: {}", e.getMessage());
        }
        // 返回目标对象结果
        return resultObject;
    }

    public static<T,S> List<T> copyBeanList(List<S> source, Class<T> target){
        // 创建目标对象数组
        List<T> targetList = new ArrayList<T>();
        // 如果源对象数组不为null且不为空
        if(null != source && !source.isEmpty()){
            //遍历 source 集合中的每个元素，并将每个元素复制到 target 类型的新对象中，然后将这些新对象添加到 targetList 中
            source.forEach(sobj -> {
                targetList.add(copyBean(sobj,target));
            });
            //for(Object obj : source){
            //    targetList.add(copyBean(obj,target));
            //}
        }
        // 返回目标对象数组
        return targetList;
    }
}
